<?php
// +----------------------------------------------------------------------
// | quanli team
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2020 http://www.fistforward.com/ All rights reserved.
// +----------------------------------------------------------------------
// | create by allen.qiang
// +----------------------------------------------------------------------

/**
 * 发布管理类 issueInfoHandler
 * @package  htdocs
 * @subpackage  quanliadmin
 * @version 1.0
 * =================================================================
 * @param $dbca                          DBCA
 * @param $issueID                       发布号
 * @param $issueUsername                 发布人
 * @param $issueTime                     发布时间
 * @param $versionNumber                 发布版本号
 * @param $issueFlg                      发布状态（0：待发布，1：发布）
 * @param $issueServerFlg                发布至正式服务器（0：待发布，1：发布，2：回滚）
 * @param $page                          当前页
 * @param $rp                            每页显示条数（默认10条）
 * @param $sortname                      排序的字段名
 * @param $sortorder                     排序方式
 * @param $dbca                          总记录条数
 * @param $flg                           变更发布状态标志（1：发布到测试服；2：在测试服上回滚；3：发布到正式服；4：在正式服上回滚）
 * @param $creator                       创建人
 * =================================================================
 * @abstract showIssueInfo()             查询全部发布信息
 * @abstract getPersonalIssueID()        查询个人发布的版本号
 * @abstract doChange()                  更改发布状态（测试发布、测试回滚、正式发布、正式回滚）
 * @abstract deploy_do()                 将SVN版本发布到测试服上
 * @abstract showIssueInfo()             查询全部发布信息
 * @abstract showIssueInfo()             查询全部发布信息
 * =================================================================
 */

quanli_require('module/base/common/quanliHttp.class.php');

class issueInfoHandler{
	
	private $dbca;
	private $issueID;
	private $issueUsername;
	private $issueTime;
	private $versionNumber;
	private $issueFlg;
	private $issueServerFlg;
	private $page;
	private $rp = 10;
	private $sortname;
	private $sortorder;
	private $total;
	private $flg;
	private $creator;

	//构造函数
	public function __construct(&$_dbca){
		$this->dbca = $_dbca;
	}
	
	//析构函数
	public function __destruct(){
	
	}
	
	//拦截器(__set)从外部设置私有属性值
	public function __set($_key, $_value) {
		$this->$_key = $_value;
	}
	
	//拦截器(__get)从外部调取私有属性值
	public function __get($_key) {
		if (isset($this->$_key)){
			return $this->$_key;
		}else {
			return null;
		}
	}
	
	/* 
	 * @abstract   showIssueInfo()            查询全部发布信息
	 * @param      $this->issueFlg            测试服发布状态
	 * @param      $this->issueServerFlg      正式服发布状态
	 * @param      $this->issueUsername       发布人
	 * @param      $this->page                当前页
	 * @param      $this->rp                  每页条数
	 * @param      $this->sortname            排序字段名
	 * @param      $this->sortorder           排序方式
	 * @return     $return_data               数组
	 */
	public function showIssueInfo(){
		
		$sql_count = 'SELECT COUNT(issueID) countNum FROM s_issue';
		
		$sql_search = 'SELECT issueID,issueUsername,issueTime,versionNumber,issueFlg,issueServerFlg FROM s_issue';
		
		//排序
		$str_order = '';
		
		//分页
		$str_limit = '';
		
		//查询条件
		$str_search = ' WHERE';
		
		//查询参数类型
		$type_search = '';
		
		//查询参数数组
		$param_search = array();
		
		//返回数据
		$return_data = '';
		
		//查询条件：发布状态
		if (is_numeric($this->issueFlg)){
			$str_search .= ' AND issueFlg = ?';
			$type_search .= 'i';
			$param_search[] = $this->issueFlg;
		}
		
		//查询条件：服务器发布状态
		if (is_numeric($this->issueServerFlg)){
			$str_search .= ' AND issueServerFlg = ?';
			$type_search .= 'i';
			$param_search[] = $this->issueServerFlg;
		}
		
		//查询条件：发布人
		if (!empty($this->issueUsername)){
			$str_search .= ' AND issueUsername = ?';
			$type_search .= 's';
			$param_search[] = $this->issueUsername;
		}
		
		//分页
		if (!empty($this->page) && is_numeric($this->page)){
			$str_limit = sprintf(' LIMIT %d, %d', ($this->page - 1) * $this->rp, $this->rp);
		}
		
		//排序
		if (!empty($this->sortname) && is_string($this->sortname)){
			$str_order = sprintf(' ORDER BY %s %s', $this->sortname, $this->sortorder);
		}
		
		//组装SQL语句
		if (!empty($type_search)){
			$str_search = str_replace('WHERE AND', 'WHERE', $str_search);
			$sql_count = $sql_count.$str_search;
			$sql_search = $sql_search.$str_search.$str_order.$str_limit;
		}else {
			$sql_search = $sql_search.$str_order.$str_limit;
		}
		
		$value_count = empty($type_search) ? $this->dbca->stmt_query($sql_count) : $this->dbca->stmt_query($sql_count,$type_search,$param_search);
		
		if ($value_count){
				
			//总记录条数
			$this->total = $value_count[0]->countNum;
				
			//得到查询结果
			$return_data = empty($type_search) ? $this->dbca->stmt_query($sql_search) : $this->dbca->stmt_query($sql_search,$type_search,$param_search);
		}
		
		return $return_data;
		
	}
	
	/*
	 * @abstract   getPersonalIssueID()             查询个人发布的版本号()
	 * @param      $this->issueUsername             发布人
	 * @return     $return_data                     数组array('revisions_fail_flg'=>, 'revisions'=>, 'fail_content'=>);
	 */
	public function getPersonalIssueID(){
		$return_data = array();
		
		//获取最近修改的版本号(20条)
		$rpc = new quanliHttp();
		$res = $rpc->get(G_WEBSITE_DOMAINNAME . '/app_innercall/deploy.php?deploy=get_revisions&username='.$this->issueUsername.'&limit=20');
		$last_res = $res['data'];
		
		if ($last_res['status'] == 'ok') {
			
			$return_data['revisions_fail_flg'] = 0;
			$return_data['revisions'] = $last_res['res'];          // 版本号加载成功，查找版本号成功返回数组
			
		} else {
			
			$return_data['revisions_fail_flg'] = 1;                //版本号加载失败标志
			
			if (isset($last_res['message']) && !empty($last_res['message'])) {
				
				$return_data['fail_content'] = $last_res['message'];
				
			} else {
				
				$return_data['fail_content'] = '加载版本号失败';
				
			}
		}
		
		return $return_data;
		
	}
	
	/* 
	 * @abstract   getPersonalIssueID()             更改发布状态
	 * @param      $this->issueUsername             发布人
	 * @return     $return_data
	 *  */
	public function doChange(){
		
		$return_data = array();
		
		if (empty($this->flg)){
			
			$return_data = array('code'=>500, 'message'=>'缺少状态参数，请联系网站管理员！');
			
		}else {
			
			switch ($this->flg){
				case 1:
					$return_data = self::confirm_issue_Info();//发布到测试服
					break;
				case 2:
					$return_data = self::rollback_revision();//测试服回滚
					break;
				case 3:
					$return_data = self::issue_server();//发布到正式服
					break;
				case 4:
					$return_data = self::issue_server_rollback();//正式服回滚
					break;
				default:
					$return_data = array('code'=>500, 'message'=>'参数传递错误，请联系网站管理员！');
					break;
			}
			
		}
		
		return $return_data;
		
	}
	
	/**
	 * 在测试服上发布代码
	 * @param int $this->issueID 发布号
	 * @param int $this->versionNumber 版本号
	 * @param int $this->flg
	 * @return $return_data = array('code','message')
	 */
	private function confirm_issue_Info(){
		
		$return_data = array();
		
		if (empty($this->issueID) || empty($this->versionNumber) || empty($this->flg) || !is_numeric($this->issueID) || !is_numeric($this->versionNumber)) {
		
			$return_data['code'] = 400;
			$return_data['message'] = '参数错误，无法操作';
		
		}
		
		if ($this->flg != 1) {
		
			$return_data['code'] = 400;
			$return_data['message'] = '发布参数错误';
		
		}
		
		if (isset($return_data['code']) && $return_data['code'] == 400){
		
			return $return_data;
		
		}else {
			
			//检查该用户的该条记录是否已发布
		    $sqlSelect = sprintf(" select count(*) counts from  s_issue where issueID=%d and issueFlg=1",$this->issueID);

			$issetResult = $this->dbca->stmt_query($sqlSelect);
			$count = $issetResult[0];
			
			if ($count->count > 0) {
				
				$return_data['code'] = 400;
				$return_data['message'] = '该条记录已经发布';

			}else {
				try {
					$this->dbca -> beginTransaction();	//开启事务
						
					//参数的真实性校验
					$issue = new entity('s_issue');
					$issue -> issueID = $this->issueID;
					if (!$this->dbca -> fetch($issue)) {
						throw new Exception('发布记录未找到！',-1000);
					}
						
					//取消时发布时间不改变，发布时发布时间需要改变
					if ($this->flg == 0) {
						$issue -> issueFlg = $this->flg;
					} elseif($this->flg == 1) {
						$nowTime = date("Y-m-d H:i:s",time());
						$issue -> issueTime = $nowTime;
						$issue -> issueFlg = $this->flg;
					}
						
					//保存发布设置到数据库
					$this->dbca -> save($issue,'issue');
						
					//清理导出的发布代码
					$last_res = self::curl_operate('clear_export',$this->versionNumber);
					if ($last_res['status'] == 'error') {
						throw new Exception($last_res['message'],-1000);
					}
						
					//清理备份的文件
					$last_res = self::curl_operate('clear_backup',$this->versionNumber);
					if ($last_res['status'] == 'error') {
						throw new Exception($last_res['message'],-1000);
					}
					
					$return_data['code'] = 200;
					$return_data['message'] = '发布成功！';
						
					$this->dbca -> commit();			//事务提交
				} catch (Exception $e) {
					$this->dbca -> rollback();			//事务回滚
						
					if ($e->getCode() == -1000) {
						
						$return_data['code'] = -1000;
						$return_data['message'] = $e->getMessage();

					} else {
						//error_log($e -> getMessage());
						$return_data['code'] = 500;
						$return_data['message'] = '系统错误，请联系网站管理员！';

					}
				}
			}
			
			return $return_data;
			
		}
	
	}
	
	/**
	 * 显示版本号对应的文件
	 * @param int $this->versionNumber 发布版本号
	 * @return $return_data = array('code','message')
	 */
	public function doIssue(){
		
		$return_data = array();
		
		//检查版本号是否已发布
		$repeatFlg = self::check_revision_issued($this->versionNumber);
		
		if ($repeatFlg == true) {
			
			$return_data['code'] = 400;
			$return_data['message'] = '该版本号已经发布，禁止再发布！';
			
		}else {
			
			//根据版本号(或者是查找的第一个版本号)获取需求发布的文件清单
			$last_res = self::curl_operate('deploy_list',$this->versionNumber);
			
			if($last_res['status'] == 'ok'){
				
				$return_data['code'] = 200;
				$return_data['message'] = $last_res['res'];
				
			}else{
				if (isset($last_res['message']) && !empty($last_res['message'])) {
					
					$return_data['code'] = 400;
					$return_data['message'] = '发布失败,'.$last_res['message'];
					
				} else {
					
					$return_data['code'] = 500;
					$return_data['message'] = '发布失败,无法加载文件清单';
					
				}
				
			}
			
		}
		
		return $return_data;
		
	}
	
	/**
	 * 将发布的代码存入到中间目录(发布到页面上)
	 * @param int $this->versionNumber 发布版本号
	 * @return $return_data = array('error_msg','data')
	 */
	public function pre_deploy_do(){
		
		$return_data = array('error_msg' => '', 'data' => '');
		
		//检查版本号是否已发布
		$repeatFlg = self::check_revision_issued($this->versionNumber);
		if ($repeatFlg == true) {
			
			$return_data['error_msg'] = '该版本号已经发布，禁止再发布！';
			
		}else {
			
			$last_res = self::curl_operate('pre_deploy',$this->versionNumber);
			
			/*
			 //---------测试
			$last_res['status'] = 'ok';
			$last_res['message'] = '';
			$last_res['res'] = array(
					'/shop/lining/newProView.php',
					'/shop/lining/theme/xth/tpls/newProView.tpl',
					'/shop/lining/discountProView.php',
					'/shop/lining/theme/xth/tpls/discountProView.tpl',
					'/shop/lining/theme/xth/tpls/cart.tpl'
			);
			//---------测试
			*/
			
			if ($last_res['status'] == 'ok') {
				
				$return_data['data'] = $last_res['res'];
				
			} else {
				if (isset($last_res['message']) && !empty($last_res['message'])) {
					
					$return_data['error_msg'] = '发布失败！'.$last_res['message'];
					
				} else {
					
					$return_data['error_msg'] = '发布失败！(发布的代码不能存入到中间目录)！';
					
				}
				
			}
			
		}
		
		return $return_data;
		
	}
	
	/**
	 * 将SVN上的代码发布到测试环境
	 * @param int $this->versionNumber 发布版本号
	 * @param str $this->creator       创建人
	 * @param $this->issueUsername     发布人
	 * @return $return_data = array('code','message')
	 * 
	 * * 
	 * array(
	 * CODE_RELEASE_PRODUCT_NAME => CODE_RELEASE_TEST_SERVER			//云端测试数据库
	 * 'pengjiu' => "112.124.24.242:8103",								//朋酒网环境
	 * 'demo'	=> "112.124.24.242:8087"								//演示环境
	 * )
	 */
	public function deploy_do(){
		
		$return_data = array();
	
		if (!is_numeric($this->versionNumber)  || empty($this->creator) || empty($this->issueUsername)) {
		
			$return_data['code'] = 400;
			$return_data['message'] = '参数错误，无法操作';
		
		}
		
		//检查版本号是否已发布
		$repeatFlg = self::check_revision_issued($this->versionNumber);
		if ($repeatFlg == true) {
		
			$return_data['code'] = 400;
			$return_data['message'] = '该版本号已经发布，禁止再发布！';
		
		}
		
		
		if (isset($return_data['code']) && $return_data['code'] == 400){
		
			return $return_data;
		
		}else {
			
			
			//检测该版本下是否有可发布的文件
			$last_res = self::curl_operate('deploy',$this->versionNumber);
			
			/*
			 //-----------------测试
			$last_res['status'] = 'ok';
			$last_res['message'] = '代码发布到正式环境失败！';
			$last_res['res'] = array(
					'/shop/lining/newProView.php',
					'/shop/lining/theme/xth/tpls/newProView.tpl',
					'/shop/lining/discountProView.php',
					'/shop/lining/theme/xth/tpls/discountProView.tpl',
					'/shop/lining/theme/xth/tpls/cart.tpl'
			);
			//-----------------测试
			*/
			
			if ($last_res['status'] == 'ok') {
				//代码发布到正式环境成功
				//对版本号检测函数的返回值进行判断，如果为真，则保存版本号信息
				$version = new entity('s_issue');
				$nowTime = date("Y-m-d H:i:s",time());
				$version -> creator = $this->creator;
				$version -> createTime = $nowTime;
				$version -> issueUsername = $this->issueUsername;
				$version -> issueTime = $nowTime;
			
				$save_result = $last_res['status'].';';
				foreach ($last_res['res'] as $key=>$value) {
					$save_result .= $value.';';
				}
			
				$version -> issueResult = $save_result;
				$version -> issueFlg = 0;
				$version -> versionNumber = $this->versionNumber;
				$version -> issueServerFlg = 0;
				$this->dbca -> save($version,'issue');   //保存发布信息
			
				//显示成功发布的文件列表 --- start
				$return_data['code'] = 200;
				$return_data['message'] = '发布成功！';
				$return_data['arr'] = $last_res['res'];
				//显示成功发布的文件列表 --- end
			
			}else{
				if (isset($last_res['message']) && !empty($last_res['message'])) {
					
					$return_data['code'] = 400;
					$return_data['message'] = $last_res['message'];
					
				} else {
					
					$return_data['code'] = 400;
					$return_data['message'] = '发布失败，无法获取发布失败信息';

				}

			}
			
			return $return_data;
			
		}
		
	}
	
	/**
	 * 代码测试服回滚
	 * @param int $this->versionNumber 版本号
	 * @param int $this->issueID 发布号
	 * @param int $this->flg
	 * @return $return_data = array('code','message')
	 */
	private function rollback_revision(){
		
		$return_data = array();
		
		if (empty($this->issueID) || empty($this->versionNumber) || empty($this->flg) || !is_numeric($this->issueID) || !is_numeric($this->versionNumber)) {
				
			$return_data['code'] = 400;
			$return_data['message'] = '参数错误，无法操作';
				
		}
		
		if ($this->flg != 2) {
				
			$return_data['code'] = 400;
			$return_data['message'] = '回滚参数错误';
		
		}
		
		if (isset($return_data['code']) && $return_data['code'] == 400){
				
			return $return_data;
				
		}else {
			
			$last_res = self::curl_operate('rollback',$this->versionNumber);								//指定版本号的代码回滚

			if ($last_res['status'] == 'ok') {
			
				$objIssue = new entity('s_issue');
				$objIssue -> versionNumber = $this->versionNumber;
				if (!$this->dbca-> fetch($objIssue)) {
					
					$return_data['code'] = 400;
					$return_data['message'] = '回滚的版本号不存在！';
					
				}else {
					
					$objIssue -> issueFlg = 2;
					$this->dbca -> save($objIssue,'issue');
					
					//显示回滚成功的文件列表 --- start
					$return_data['code'] = 200;
					$return_data['message'] = '回滚成功';
					$return_data['arr'] = $last_res['res'];
					//显示回滚成功的文件列表 --- end
					
				}
			
			} else {
				if (isset($last_res['message']) && !empty($last_res['message'])) {
					
					$return_data['code'] = 400;
					$return_data['message'] = $last_res['message'];
					
				} else {
					
					$return_data['code'] = 400;
					$return_data['message'] = '代码回滚失败！';
					
				}
				
			}
			
			return $return_data;
			
		}
				
	}
	
	
	/**
	 * 回滚正式线上的代码
	 * @param int $this->issueID 发布号
	 * @param int $this->versionNumber 版本号
	 * @param int $this->flg
	 * @return $return_data = array('code','message')
	 */
	private function issue_server_rollback(){
		
		$return_data = array();
		
		if (empty($this->issueID) || empty($this->versionNumber) || empty($this->flg) || !is_numeric($this->issueID) || !is_numeric($this->versionNumber)) {
			
			$return_data['code'] = 400;
			$return_data['message'] = '参数错误，无法操作';
			
		}
		
		if ($this->flg != 4) {
			
			$return_data['code'] = 400;
			$return_data['message'] = '回滚参数错误';

		}
		
		if (isset($return_data['code']) && $return_data['code'] == 400){
			
			return $return_data;
			
		}else {
			
			try {
				//真实性校验
				$objIssue = new entity('s_issue');
				$objIssue -> issueID = $this->issueID;
				$objIssue -> versionNumber = $this->versionNumber;
				if (!$this->dbca-> fetch($objIssue)) {
					throw new Exception('回滚记录不存在！',-1000);
				}
			
				if ($objIssue -> issueServerFlg == 0) {
					throw new Exception('该版本号还未发布！',-1000);
				}
			
				if ($objIssue -> issueServerFlg == 2) {
					throw  new Exception('该版本号已经回滚！',-1000);
				}
			
			
				//执行正式服务器的回滚操作
				//参数数组
				$params = array(
						'site_id' 		=> 	$this->SITE_ID,
						'api_key' 		=> 	$this->APIKEY,
						'secret_key' 	=> 	$this->SECRET_KEY,
						'revision'		=>  $this->versionNumber
				);
			
				$signature = self::signatureAlgorithm($params);
				if (strlen($signature) != 16) {
					throw new Exception('生成签名错误！',-1000);
				}
			
				$rpc = new quanliHttp();																//实例化rpc_http
				//$server = '127.0.0.1';
				$res = $rpc->get('http://'.CODE_RELEASE_TEST_SERVER.'/app_external/release/reverse.php?revision='.$this->versionNumber.'&site_id='.$this->SITE_ID.'&api_key='.$this->APIKEY.'&secret_key='.$this->SECRET_KEY.'&signature='.$signature .'&productName=' . CODE_RELEASE_PRODUCT_NAME);

				$last_res = $res['data'];
			
				//$last_res['code'] = 200;  //本地测试
				//error_log(print_r($res,true));
			
				if ($last_res['code'] == 200) {
					$this->dbca -> execute('UPDATE s_issue SET issueServerFlg=2 WHERE issueID='.$this->issueID);
			
					$return_data['code'] = 200;
					$return_data['message'] = '回滚成功';
			
				} else {
					throw new Exception('回滚失败',-1000);
				}
			
			} catch (Exception $e) {
				if ($e->getCode() == -1000) {
			
					$return_data['code'] = -1000;
					$return_data['message'] = $e->getMessage();
			
				} else {
			
					$return_data['code'] = 500;
					$return_data['message'] = '系统错误，请联系网站管理员！';
			
				}
			}
			
			return $return_data;
			
		}
		
		
		
	}
	
	
	/**
	 * 发布代码至正式线上
	 * @param int $this->issueID 发布号
	 * @param int $this->versionNumber 版本号
	 * @param int $this->flg
	 * @return $return_data = array('code','message')
	 */
	private function issue_server () {

		$return_data = array();
		
		//有效性校验
		if (empty($this->issueID) || empty($this->versionNumber) || empty($this->flg) || !is_numeric($this->issueID) || !is_numeric($this->versionNumber)) {
			
			$return_data['code'] = 400;
			$return_data['message'] = '参数错误，无法操作';
			
		}
	
		if ($this->flg != 3) {
			
			$return_data['code'] = 400;
			$return_data['message'] = '发布参数错误';
			
		}
	
		if (isset($return_data['code']) && $return_data['code'] == 400){
			
			return $return_data;
			
		}else {
			
			try {
			
				//测试服务器未确认的版本号，不能在正式线上发布！
				$test_issued = $this->dbca-> stmt_query('SELECT COUNT(*) as count FROM s_issue WHERE issueID=? AND versionNumber=? AND issueFlg=0','is',$this->issueID,$this->versionNumber);
				if ($test_issued[0]->count > 0) {
					throw new Exception('该版本号在测试服务器还未确认，不能往正式服务器发布！', -1000);
			
				}else {
					
					//真实性校验
					$objIssue = new entity('s_issue');
					$objIssue -> issueID = $this->issueID;
					$objIssue -> versionNumber = $this->versionNumber;
					if (!$this->dbca-> fetch($objIssue)) {
						throw new Exception('发布记录不存在',-1000);
					}
						
					if ($objIssue -> issueServerFlg != 0) {
						throw new Exception('该版本号已发布或回滚',-1000);
					}
						
					//正式发布到服务器
					//参数数组
					$params = array(
							'site_id' 		=> 	$this->SITE_ID,
							'api_key' 		=> 	$this->APIKEY,
							'secret_key' 	=> 	$this->SECRET_KEY,
							'revision'		=>  $this->versionNumber
					);
						
					$signature = self::signatureAlgorithm($params);
						
					if (strlen($signature) != 16) {
						throw new Exception('生成签名错误！' ,-1000);
					}
						
					$rpc = new quanliHttp();																//实例化rpc_http
					$res = $rpc->get('http://'.CODE_RELEASE_SERVER.'/app_external/release/release.php?revision='.$this->versionNumber.'&site_id='.$this->SITE_ID.'&api_key='.$this->APIKEY.'&secret_key='.$this->SECRET_KEY.'&signature='.$signature . '&productName=' . CODE_RELEASE_PRODUCT_NAME);
					$last_res = $res['data'];						
					if (isset($last_res['code']) && $last_res['code'] == 200) {
						$this->dbca-> execute('UPDATE s_issue SET issueServerFlg=1 WHERE issueID='.$this->issueID);
							
						$return_data['code'] = 200;
						$return_data['message'] = '发布成功';
							
					} else {
						throw new Exception('发布失败$',-1000);
					}
					
				}
			
			} catch (Exception $e) {
				if ($e -> getCode() == -1000) {
			
					$return_data['code'] = -1000;
					$return_data['message'] = $e->getMessage();
			
				} else {
			
					$return_data['code'] = 500;
					$return_data['message'] = '系统错误，请联系网站管理员！';
			
				}
			}
			
			return $return_data;
			
		}
	
	}
	
	/**
	 * 发布代码的curl处理
	 * @param string $operateType 处理类型
	 * @param int $revision 操作代码版本号
	 */
	private function curl_operate($operateType,$revision) {

        $repoList=array(
            0=> '127.0.0.1:8127'
        );

		foreach ($repoList as $repoName => $repoAddr){
			$rpc = new quanliHttp();		//实例化rpc_http
            $res = $rpc->get(G_WEBSITE_DOMAINNAME . '/app_innercall/deploy.php?deploy='.$operateType.'&revision='.$revision);
		}
	
		
		$last_res = $res['data'];
		return $last_res;
	}
	
	/* 
	 * 检测版本号
	 *  */
	private function check_revision_issued ($versionNum) {
		
		//已发布的版本号不能再发布
		$objIssue = new entity('s_issue');
		$objIssue -> versionNumber = $versionNum;
		if ($this->dbca -> fetch($objIssue)) {
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * 客户端生成签名
	 * @param array $params 参数数组
	 * @return mix
	 */
	private function signatureAlgorithm($params) {
		if(empty($params) || !is_array($params)){
			return 400;
		}
		krsort($params);
		$unsigned_params_string = urldecode(str_replace('=', '',http_build_query($params, '', '')));
		$reverse_params_string = strrev($unsigned_params_string);
		$sha1_params_string = sha1($reverse_params_string);
		$md5_params_string = md5($sha1_params_string);
		return substr($md5_params_string, 16, 16);
	}
	
	/**
	 * 发布代码对比
	 * @param array $params 参数数组
	 * @return $return_data = array('code','message')
	 */
	public function doCompare($fileName){
		
		$return_data = array('code'=>'' , 'message'=>'');
		
		if (empty($fileName) || empty($this->versionNumber) || !is_numeric($this->versionNumber)) {
			
			$return_data['code'] = 400;
			$return_data['message'] = '参数错误，无法操作';
			
		}else {
			
			$last_res = self::curl_operate('do_compare',$this->versionNumber,$fileName);
			
			/*
			 //---测试
			$last_res['status'] = 'ok';
			$last_res['res'] = '对比代码内容';
			//--测试
			*/
			
			if ($last_res['status'] == 'ok') {
				
				$return_data['code'] = 200;
				
				foreach ($last_res['res'] as $value) {
					$return_data['message'] .= $value.'<br/>';
				}
				
			} else {
				if (isset($last_res['message']) && !empty($last_res['message'])) {
					
					$return_data['code'] = 400;
					$return_data['message'] = $last_res['message'];
					
				} else {
					
					$return_data['code'] = 500;
					$return_data['message'] = '对比代码获取失败！';
					
				}
				
			}
			
		}
		
		return $return_data;
		
	}
	
	/**
	 * 查看发布结果
	 * @param int $issueID 发布号
	 * @param int $revision 版本号
	 */
	public function get_issue_result() {

		$return_data = array('code'=>'', 'message'=>'');
		
		if (!isset($this->issueID,$this->versionNumber) || !is_numeric($this->issueID) || !is_numeric($this->versionNumber)) {
			
			$return_data['code'] = 400;
			$return_data['message'] = '参数错误，无法操作！';
			
		}
	
		$objIssue = new entity('s_issue');
		$objIssue -> issueID = $this->issueID;
		$objIssue -> versionNumber = $this->versionNumber;
		if (!$this->dbca -> fetch($objIssue)) {
			
			$return_data['code'] = 400;
			$return_data['message'] = '该版本号还未发布！';
			
		}
		
		if (empty($return_data['code'])){
			
			$temp_array = array();
			$issue_result = '';
			$temp_array = explode(';',$objIssue->issueResult);
			//显示发布结果
			$issue_result .= '<div style=\'margin:-10px 0px 0px 50px;line-height:20px;\'>发布状态：'.$temp_array[0].'<br/>';
			$issue_result .= '发布文件：<br/>';
			foreach ($temp_array as $key=>$value) {
				if ($key == '0') {
					continue;
				}
				$issue_result .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$value.'<br/>';
			}
			$issue_result .= '</div>';
			$issueResult = self::issue_marker('发布结果',$issue_result,'black');
			
			$return_data['code'] = 200;
			$return_data['message'] = $issueResult;
		}
		
		return $return_data;
	}
	
	/**
	 * 提示信息
	 * @param string $title 显示标题
	 * @param string $error_msg 提示信息
	 * @param string $color 显示内容颜色
	 * @return unknown
	 */
	private function issue_marker($title,$error_msg,$color){
		$marker_html = "<div class='items clearfix' id='export_file_list'>";
		$marker_html .= "<h2 style='' class='tal'>  ".$title."</h2>";
		$marker_html .= "<div class='items2'><div>	<font color='".$color."'>".$error_msg."</font></div></div>";
		$marker_html .= "</div>";
		return $marker_html;
	}
	
	
	/**
	 * 发布代码时，将代码提交到其它版本库中
	 * @param int $revision 需要发布的版本号
	 * @param string $repo_list	版本库列表 string json编码后的array
	 * @param string $user	提交代码的用户
	 * @param string $passwd	提交代码的用户密码
	 * @return array 
	 */
	public function sync_repo($revision,$repo_list,$user,$passwd){
		$operateType='sync';
		$server = CODE_RELEASE_TEST_SERVER_ADDR;

		$rpc = new quanliHttp();		//实例化rpc_http
		$res = $rpc->get('http://'.CODE_RELEASE_TEST_SERVER.'/app_innercall/deploy.php?deploy='.$operateType.'&revision='.$revision.'&productName=' . CODE_RELEASE_PRODUCT_NAME . '&repolist=' . $repo_list . '&user=' . $user . '&passwd=' . $passwd);

	
		
		$last_res = $res['data'];
		return $last_res;
	}
	
	
}
